package rkdwogus7.swing;

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;

import java.awt.Dimension;

import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.border.LineBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import java.awt.Color;
import java.util.ArrayList;

import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ScrollPaneConstants;

import rkdwogus7.model.SungJukVO;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class CJTable extends JDialog {

	private final JPanel contentPanel = new JPanel();
	private JTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		try {
			CJTable dialog = new CJTable();
			dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
			dialog.setVisible(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Create the dialog.
	 */
	public CJTable() {
		setBounds(100, 100, 640, 480);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setLayout(new BorderLayout(0, 0));
		{
			JPanel panel = new JPanel();
			panel.setPreferredSize(new Dimension(180, 10));
			contentPanel.add(panel, BorderLayout.EAST);
			panel.setLayout(new BorderLayout(0, 0));
			{
				JPanel panel_1 = new JPanel();
				panel.add(panel_1, BorderLayout.NORTH);
				{
					JLabel lblNewLabel = new JLabel("");
					lblNewLabel.setPreferredSize(new Dimension(100, 150));
					lblNewLabel.setBorder(new LineBorder(Color.LIGHT_GRAY, 1, true));
					panel_1.add(lblNewLabel);
				}
			}
			{
				JPanel panel_1 = new JPanel();
				panel.add(panel_1, BorderLayout.SOUTH);
				{
					JButton btnNewButton_2 = new JButton("사진등록");
					panel_1.add(btnNewButton_2);
				}
				{
					JButton btnNewButton_3 = new JButton("사진등록");
					panel_1.add(btnNewButton_3);
				}
			}
		}
		{
			JPanel panel = new JPanel();
			panel.setPreferredSize(new Dimension(420, 10));
			contentPanel.add(panel, BorderLayout.WEST);
			panel.setLayout(new BorderLayout(0, 0));
			{
				JPanel panel_1 = new JPanel();
				panel.add(panel_1, BorderLayout.NORTH);
				{
					JButton btnNewButton = new JButton("New button");
					panel_1.add(btnNewButton);
				}
				{
					JButton btnNewButton_1 = new JButton("New button");
					panel_1.add(btnNewButton_1);
				}
			}
			{
				JPanel panel_1 = new JPanel();
				panel.add(panel_1, BorderLayout.CENTER);
				{
					JScrollPane scrollPane = new JScrollPane();
					scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
					scrollPane.setPreferredSize(new Dimension(425, 150));
					panel_1.add(scrollPane);
					{	
						// JTable에 저장할 데이터를 작성
						// 여기서는 성적 테이터를 가져와서 사용
						// 먼저, ArraList를 생성하고
						// 개별 데이터를 SungJukVO 형태로 저장함
						ArrayList<SungJukVO> sjList = new ArrayList<>();
						sjList.add( new SungJukVO("지현", 98, 45, 23) );
						sjList.add( new SungJukVO("태희", 99, 98, 100) );
						sjList.add( new SungJukVO("혜교", 35, 60, 50) );
						sjList.add( new SungJukVO("수지", 40, 25, 3) );
						sjList.add( new SungJukVO("사랑", 55, 95, 46) );
						// DAO에서 가져오는 것도 배울거야. 이건 다음 시간에
						// arralist에 넣는 것이 배열에 넣는 것보다 나중에 수월할 거야.
						// VOclass를 이용해서 데이터를 담아 두면 더 편할 수 있지.
						// 그것을 jtable로 불러 오게 되는 거지.
						// 이 부분은 JDBC 할 때 다시 보도록 하고
						
						// ArraList에 작성된 데이터들을
						// JTable에 표시하려면, 먼저
						// DefaultTableModel 객체를 생성한 후
						// addRow method로 데이터를 추가해야 함
						
						DefaultTableModel model = new DefaultTableModel();
						
						// 4. 테이블 수정 불가 옵션
						// JTable의 외형적인 모양이나 특정 기능을
						// 비활성시키고 싶다면 defaultTableModel을
						// 내부 클래스 형태로 선언해야 함(511페이지)
						// 객체 선언 할 때 중괄호로 내용 넣어 주면 이게 내부 클래스라고 하네.
						model = new DefaultTableModel() {
							// cell의 기본 속성 설정
							// "이름", "국어", "영어", "수학" 처럼
							// 각 행의 열 속성을 false로 설정하여 건드리지 못하게 함
							boolean[] isEdit = new boolean[] {
								false, false, false, false
								// 각 열에 대한 수정 여부
							};
							
							@Override
							public boolean isCellEditable(int row, int column) {
								// 이것은 처음 스윙 컴포넌트가 만들어 질 때 나오므로 실행의 주체는 컴포넌트 자체임
								return isEdit[column];  // 모든 열 수정 불가. col로 줄이는 것이 더 좋음
							}
							// 컨트롤 스페이스 눌러서 자동으로 만듬
						};
						
						// 1. TableModel의 제목행을 설정
						model.setColumnIdentifiers(
								new String[] { "이름", "국어", "영어", "수학" }
								);
						// 이건 벡터(ArrayList)로 만들어도 상관 없어. 여기선 그냥 배열로
						
						// 2. TableModel의 본문행을 작성
						for( SungJukVO sj : sjList ) {
						model.addRow(
								new String[] { 
									sj.getName(), sj.getKor()+"", sj.getEng()+"", sj.getMat()+"" }
								);
						}
						// sjList에 있는 데이터를 집어 넣어 준다. +""는 숫자를 문자로 넣기 위해 사용
						// addRow를 이용했으니 열로 집어넣은 상태
						// 제목 행에 만든 열 수 만큼 본문행에도 데이터를 넣어야 하겠지.
						
						table = new JTable();
						table.setPreferredSize(new Dimension(0, 150));
						scrollPane.setViewportView(table);
						
						// 3. 생성한 model을 JTable에 적용
						table.setModel(model);
						
						// 여기까지 한 다음에 정렬도 하고, 글자도 바꾸고 해야겠지?
						// 뒤에 배경도 넣어 주고, 이벤트도 걸어 줘야 하겠지
						// 리스트 띄운 상태에서 더블클릭하면 상세 정보가 나오게 만들 수도 있지
						
						// 높이, 색깔에 문제도 있고 스윙 화면에서 글자도 바꿀 수 있고
						// 메탈 / 님버스에 따라 모양도 바뀌고
						// 이런 부분들을 조정해 볼 거야. 위로 올라가서 확인!
						
						// 5. JTable 외형 변경
						// 5-1. 선택 시 전경/배경 색 변경
						table.setSelectionForeground(
								// new Color(r, g, b);
								new Color(255, 255, 255));
						table.setSelectionBackground(
								new Color(255, 0, 0));
						// 바꿔 가면서 지정 해 보고 실행도 해 보시게~
						
						// 5-2. 행 높이
						table.setRowHeight(25);
						
						// 5-3. 열 이동 불가
						table.getTableHeader().setReorderingAllowed(false);
						// 이게 없으면 열들의 위치를 스윙 창에서 변경시킬 수 있는 거야.
						
						// 5-4. 제목행 높이 지정
						table.getTableHeader().setPreferredSize(
								new Dimension(10, 30));
						// 얘는 제목 행을 건드리는 것.
						
						// 5-5. 특정 열의 너비 지정
						table.getColumn("이름").setPreferredWidth(40);
						
						// 5-6. 본문행의 내용을 가운데 정렬
						// 각 열의 외형을 변경하려면 DefaultTableCellRenderer 객체 이용
						DefaultTableCellRenderer render = 
								(DefaultTableCellRenderer)
								table.getDefaultRenderer(getClass());
						// 그냥 만들고 형 변환 시켜 주면 돼.
						// 현재 클래스인 JTable의 기본 renderer를 가져옴
						render.setHorizontalAlignment(SwingConstants.CENTER);
						// 본문행의 내용을 가운데 정렬
						// html에서는 간단하게 사용할 수 있는데 얘는 칸 하나 하나를 표시할 때
						// cellrenderer를 이용해서 바꾸는거야.
						// horizental method로 가운데정렬이나 왼쪽, 오른쪽 정렬을 시키게 되는 거지.
						
						// 6. JTable에 마우스 더블클릭 이벤트 지정
						// 얘는 디자인 가서 테이블에 마우스 우클릭 해서 이벤트 걸고 가져 와
						table.addMouseListener(new MouseAdapter() {
							@Override
							public void mouseClicked(MouseEvent e) {
								if (e.getClickCount() == 2) {
									JTable t = (JTable) e.getSource();
									// 더블클릭 하면 JTable에서 객체를 들고 와야겠지?
									int r = t.getSelectedRow(); // 행
									int c = t.getSelectedColumn(); // 열
									JOptionPane.showMessageDialog(null, t.getValueAt(r, c));
									// 해당하는 행과 열의 정보를 새 창에 띄워 줌
								} // 더블 클릭 시 이벤트 발생
							} // if
						}); // MouseListener
						
						
						
						
						
					}
				}
			}
		}
		{
			JPanel buttonPane = new JPanel();
			buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
			{
				JButton okButton = new JButton("OK");
				okButton.setActionCommand("OK");
				buttonPane.add(okButton);
				getRootPane().setDefaultButton(okButton);
			}
		}
	}

}
